import sysConfig from '../common/config/config.js'
// 状态管理
import store from '../store'

/**
 * 提示信息
 * 
 * @param {String} title 提示标题
 * @param {String} icon 图标层, none / success / loading
 * @param {Number} duration 提示时间
 * @param {Boolean} mask 遮罩层
 */
const msg = (title, icon = 'none', duration = 1500, mask = false) => {
	//统一提示方便全局修改
	if (Boolean(title) === false) {
		return
	}
	uni.showToast({title,duration,mask,icon})
	if (store.state.user.shock) {
		uni.vibrateShort() // 使手机发生较短时间的振动(15ms)
	}
}

/**
 * 获取当前页面栈
 * 
 * 示例在地址管理，登录要参考下
 */
const prePage = () => {
	let pages = getCurrentPages();
	let prePage = pages[pages.length - 2];
	// #ifdef H5
	return prePage
	// #endif
	return prePage.$vm
}

/**
 * 获取系统信息
 */
const sysInfo = () => {
	let sys = uni.getSystemInfoSync()
	let menuButton = null
	// #ifdef MP
	menuButton = uni.getMenuButtonBoundingClientRect()
	// #endif
	let data = {
		top: sys.statusBarHeight,
		height: sys.statusBarHeight + uni.upx2px(80),
		screenHeight: sys.screenHeight,
		platform: sys.platform,
		model: sys.model,
		windowWidth: sys.windowWidth,
		windowHeight: sys.windowHeight,
		windowBottom: sys.windowBottom,
		rpx: sys.windowWidth / 750,
		menuButtonW: menuButton? menuButton.width : 0,
		menuButtonH: menuButton? menuButton.height : 0,
	};
	// #ifndef MP
	data.height = sys.statusBarHeight + uni.upx2px(80)
	// #endif
	// #ifdef MP-WEIXIN || MP-BAIDU || MP-QQ || MP-TOUTIAO || MP-WEIXIN
	let custom = uni.getMenuButtonBoundingClientRect() // 获取小程序右上角胶囊按钮的布局位置信息
	data.height = custom.bottom + custom.top - sys.statusBarHeight
	// #endif		
	// #ifdef MP-ALIPAY
	data.height = sys.statusBarHeight + sys.titleBarHeight
	// #endif
	// sys_config.debug?console.log(data):''
	return data
}

/**
 * 通用页面跳转
 */
const go = (url = '/pages/index/index') => {
	const navList = [
		'/pages/index/index',
		'/pages/works/works',
		'/pages/user/user'
	]
	if(navList.indexOf(url) !== -1) {
		uni.switchTab({
			url: url
		})
	} else {
		uni.navigateTo({
			url: url
		})
	}
}
/**
 * 通用页面重定向
 */
const redi = (url = '/pages/index/index') => {
	const navList = [
		'/pages/index/index',
		'/pages/works/works',
		'/pages/user/user'
	]
	if(navList.indexOf(url) !== -1) {
		uni.switchTab({
			url: url
		})
	} else {
		uni.redirectTo({
			url: url
		})
	}
}

/**
 * 通用返回上步
 */
const goBack = (delta = 1) => {
	uni.navigateBack({
		delta: delta
	})
}

/**
 * 微信支付
 * 
 * @param {Object} option 微信支付参数
 */
const wxPayment = (option) => {
	let options = Object.assign({
		payment: {},
		success: () => {},
		fail: () => {},
		complete: () => {},
	}, option)
	uni.requestPayment({
		appId: options.payment.appId,
		timeStamp: options.payment.timeStamp,
		nonceStr: options.payment.nonceStr,
		package: options.payment.package,
		signType: options.payment.signType,
		paySign: options.payment.paySign,
		success(res) {
			options.success(res)
		},
		fail(res) {
			options.fail(res)
		},
		complete(res) {
			options.complete(res)
		}
	})
}

/**
 * 获取用户位置信息
 * 
 * @param {Boolean} isOpen 授权失败是否开启用户设置
 */
const getLocation = (isOpen = true) => {
	uni.getLocation({
	    type: 'wgs84',
	    success(res) {
			// printLog('当前位置的经度：' + res.longitude)
			// printLog('当前位置的纬度：' + res.latitude)
			const data = {
				longitude: res.longitude,
				latitude: res.latitude,
			}
			store.dispatch('user/setLat', data)
	    },
		fail(err) {
			if(isOpen) {
				uni.showModal({
					title: '提示',
					content: '请允许获取您位置信息以确保提供给您更好的服务',
					success(res) {
						if(res.confirm) {
							uni.openSetting({
								success(settingRes) {
									if(settingRes.authSetting.scope.userLocation) {
										getLocation(false)
									}
								}
							})
						}
					}
				})
			}
		}
	})
}

/**
 * 时间转换为时辰
 * 
 * @param {int} time 需要转换的时间 => new Date().getHours()
 */
const time2Lunar = (time = new Date().getHours()) => {
	const arr = [
		'子时',
		'丑时', '丑时',
		'寅时', '寅时',
		'卯时', '卯时',
		'辰时', '辰时',
		'巳时', '巳时',
		'午时', '午时',
		'未时', '未时',
		'申时', '申时',
		'酉时', '酉时',
		'戊时', '戊时',
		'亥时', '亥时',
		'子时'
	]
	let lunarHour = arr[time]
	return lunarHour
}

/**
 * 获取指定或当前时间
 * 
 * @param {Int} date 需要转换的时间 => new Date()
 * @param {String} type 返回的格式, all => 日期加时间 , date => 日期, time => 时间
 */
const getDate = (type = 'all', date = new Date()) => {
	const year = date.getFullYear()
	const month = date.getMonth() + 1
	const day = date.getDate()
	const hour = date.getHours()
	const minute = date.getMinutes()
	const second = date.getSeconds()
	
	let str = type === 'all' ? `${[year, month, day].map(formatNumber).join('-')} ${[hour, minute, second].map(formatNumber).join(':')}` : type === 'date' ? `${[year, month, day].map(formatNumber).join('-')}` : `${[hour, minute, second].map(formatNumber).join(':')}`
	
	return str
	// return `${[year, month, day].map(formatNumber).join('-')} ${[hour, minute, second].map(formatNumber).join(':')}`
}
const formatNumber = n => {
	n = n.toString()
	return n[1] ? n : `0${n}`
}

/**
 * 获取指定的星期几
 * 
 * @param {Number} 需要获取的星期几 => new Date().getDay()
 */
const getWeek = (e = new Date().getDay()) => {
	const weekArr = ['星期日', '星期一', '星期二', '星期三', '星期四', '星期五', '星期六']
	return weekArr[e]
}

/**
 * 获取指定日期的星座
 * 
 * @param {Number} data.month 指定日期的月份 => new Date().getMonth() + 1
 * @param {data.day} 指定日期的日 => new Date().getDate()
 */
const getConstellation = (data = {month: new Date().getMonth() + 1, day: new Date().getDate()}) => {
	// 星座列表
	const xingzuoList = [
		{
			id: 'mojie',
			name: '魔羯座',
			date: '12月22日～1月19日',
			icon: 'cons_iconfont iconmojie',
			able: true,
		},
		{
			id: 'shuiping',
			name: '水瓶座',
			date: '1月20日～2月18日',
			icon: 'cons_iconfont iconshuiping',
			able: true,
		},
		{
			id: 'shuangyu',
			name: '双鱼座',
			date: '2月19日～3月20日',
			icon: 'cons_iconfont iconshuangyu',
			able: true,
		},
		{
			id: 'baiyang',
			name: '白羊座',
			date: '3月21日～4月19日',
			icon: 'cons_iconfont iconbaiyang',
			able: true,
		},
		{
			id: 'jinniu',
			name: '金牛座',
			date: '4月20日～5月20日',
			icon: 'cons_iconfont iconjinniu',
			able: true,
		},
		{
			id: 'shuangzi',
			name: '双子座',
			date: '5月21日～6月21日',
			icon: 'cons_iconfont iconshuangzi',
			able: true,
		},
		{
			id: 'juxie',
			name: '巨蟹座',
			date: '6月22日～7月22日',
			icon: 'cons_iconfont iconjuxie',
			able: true,
		},
		{
			id: 'shizi',
			name: '狮子座',
			date: '7月23日～8月22日',
			icon: 'cons_iconfont iconshizi',
			able: true,
		},
		{
			id: 'chunv',
			name: '处女座',
			date: '8月23日～9月22日',
			icon: 'cons_iconfont iconchunv',
			able: true,
		},
		{
			id: 'tiancheng',
			name: '天秤座',
			date: '9月23日～10月23日',
			icon: 'cons_iconfont icontiancheng',
			able: true,
		},
		{
			id: 'tianxie',
			name: '天蝎座',
			date: '10月24日～11月22日',
			icon: 'cons_iconfont icontianxie',
			able: true,
		},
		{
			id: 'sheshou',
			name: '射手座',
			date: '11月23日～12月21日',
			icon: 'cons_iconfont iconsheshou',
			able: true,
		},
	]
	// 两个星座分割日
	const monthList = [22, 20, 19, 21, 21, 21, 22, 23, 23, 23, 23, 22]
	let index = data.month
	// 所查询日期在分割日之前，索引-1，否则不变
	if(data.day <= monthList[data.month - 1]) {
		index = index - 1
	}
	return xingzuoList[index]
}

/**
 * console.log(), 根据config配置是否打印
 * 
 * @param {*} 需要打印的数据
 */
const printLog = (e) => {
	if(sysConfig.debug) {
		console.log(JSON.parse(JSON.stringify(e)))
	}
}

/**
 * 判断是否为null, undefined, ''
 * 
 * @param {*} 需要判断的数据
 */
const isNullOrEmpty = (e) => {
	let val = e || ''  ? false : true
	return val
}

/**
 * 判断是否为空对象
 * 
 * @param {*} 需要判断的数据
 */
const isEmptyObj = (e) => {
	return Object.keys(e).length === 0 ? true : false
}

/**
 * 获取随机唯一标识
 * 
 * @param {Number} uuid的长度, 默认36位
 * @param {Number} uuid的基数, 默认10
 */
const uuid = (len = 36, radix = 10) => {
	let chars = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'.split('')
	let uuid = []
	let i = 0
	radix = radix || chars.length
	if(len) {
		for (i = 0; i < len; i++) {
			uuid[i] = chars[0 || parseInt(Math.random() * radix)]
		}
		uuid[8] = uuid[13] = uuid[18] = uuid[23] = '-'
		uuid[14] = '4'
	}
	
	return uuid.join('')
}

/**
 * 全局方法
 * 
 * @method $msg 全局提示
 * @method $prePage 页面栈
 * @method $sysInfo 系统信息
 * @method $go 通用页面跳转
 * @method $redi 通用页面重定向
 * @method $goBack 通用返回上步
 * @method $wxPayment 微信支付
 * @method $getLocation 获取用户位置经纬度信息
 * @method $time2Lunar 时间转换为时辰
 * @method $getDate 获取指定或当前时间
 * @method $getWeek 获取指定的星期几
 * @method $getConstellation 获取指定的星期几
 * @method $printLog 打印结果
 * @method $isNullOrEmpty 判断是否为null, undefined, ''
 * @method $isEmptyObj 判断是否为空对象
 * @method $uuid 获取随机唯一标识
 * 
 */

module.exports = {
  msg: msg,
  prePage: prePage,
  sysInfo: sysInfo,
  go: go,
  redi: redi,
  goBack: goBack,
  wxPayment: wxPayment,
  getLocation: getLocation,
  time2Lunar: time2Lunar,
  getDate: getDate,
  getWeek: getWeek,
  getConstellation: getConstellation,
  printLog: printLog,
  isNullOrEmpty: isNullOrEmpty,
  isEmptyObj: isEmptyObj,
  uuid: uuid,
}